/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package firmasotro;

import java.security.*;
import java.security.spec.*;
import java.io.*;

public class VerificaFirma implements Constantes {

    public static void main(String[] args) throws Exception {
// Pedimos el fichero a verificar
// y fichero de clave publica a usar
        BufferedReader teclado =
                new BufferedReader(new InputStreamReader(
                System.in));
        System.out.print("Indique fichero a verificar:");
        String fichero_verificar = teclado.readLine();
        if (!new File(fichero_verificar).exists()) {
            System.out.println("El fichero "
                    + fichero_verificar + " no existe");
            return;
        }
        String fichero_firma = fichero_verificar + ".sign";
        if (!new File(fichero_firma).exists()) {
            System.out.println("El fichero "
                    + fichero_verificar + " no existe");
            return;
        }
// Recuperamos la clave publica
        System.out.print("Indique que fichero tiene la"
                + " clave publica a usar:");
        String fichero_publica = teclado.readLine();
        FileInputStream fis =
                new FileInputStream(fichero_publica);
        byte[] buffer = new byte[fis.available()];
        fis.read(buffer);
        fis.close();
        X509EncodedKeySpec clave_publica_spec =
                new X509EncodedKeySpec(buffer);
        KeyFactory kf = KeyFactory.getInstance("RSA");
        PublicKey clave_publica =
                kf.generatePublic(clave_publica_spec);
        System.out.println("Carta publica recuperada");
// Comprobamos la firma
        fis = new FileInputStream(fichero_firma);
        byte[] firma = new byte[fis.available()];
        fis.read(firma);
        fis.close();
        fis = new FileInputStream(fichero_verificar);

        Signature s = Signature.getInstance("SHA1withRSA");
        s.initVerify(clave_publica);
        buffer = new byte[1024];
        while (fis.available() >= 1024) {
            fis.read(buffer);
            s.update(buffer);
        }
        int quedan = fis.available();
        fis.read(buffer, 0, quedan);
        s.update(buffer, 0, quedan);
        fis.close();
        if (s.verify(firma)) {
            System.out.println(
                    "El fichero firmado es correcto");
        } else {
            System.out.println("La firma no es correcta");
        }
    }
}
